package day17.tarena.GUI;


import java.awt.*;                      //导入抽象窗口工具集包(abstract window toolkit)
import java.awt.event.*;                //导入窗口事件工具包
import java.io.*;                       //导入输入输出工具包
import java.awt.datatransfer.*;         //导入数据转化工具包
//菜单工具条类(添加菜单项,子菜单)
class MyMenuBar extends MenuBar{          // MyMenuBar类继承MenuBar类(类方法)
    public MyMenuBar(Frame parent){       // 构造函数
     parent.setMenuBar(this);             // 向parent添加自身
    }
    public void addMenus(String[] menus){   // 菜单条下添加菜单项
     for(int i=0;i<menus.length;i++)
     add(new Menu(menus[i]));
    }
    public void addMenuItems(int menuNumber,String[] items){   // 菜单添加(类方法)
     for(int i=0;i<items.length;i++){               // 循环0~menus.length-1次
      if(items[i]!=null)                            // 向各个菜单项添加子菜单
      getMenu(menuNumber).add(new MenuItem(items[i]));
      else getMenu(menuNumber).addSeparator();
     }
    }
    public void addActionListener(ActionListener a1){// 注册所有动作监听对象(类方法)
     for(int i=0;i<getMenuCount();i++)              // 循环到菜第i个菜单数
     for(int j=0;j<getMenu(i).getItemCount();j++) // 向第i个菜单的第j个子菜单注册动作事件监听
     getMenu(i).getItem(j).addActionListener(a1);
    }
}
// 文件管理类(处理文件的打开,保存等,拥有文件对话框成员)
class MyFile{                                        // MyFile类定义
    private FileDialog fDlg;                         // 声明一个文件对话框(类成员)
    public MyFile(Frame parent){                     // 构造函数(类方法)
     fDlg=new FileDialog(parent,"",FileDialog.LOAD);// 初始化文件对话框
    }
    private String getPath(){                           // (类方法)
     return fDlg.getDirectory()+"\\"+fDlg.getFile();   // 返回选中文件的路径
    }
    public String getData() throws IOException{
     fDlg.setTitle("打开");                    // 设定文件对话框的标题为"打开"
     fDlg.setMode(FileDialog.LOAD);          // 将文件对话框的模式设定为打开模式
     fDlg.setVisible(true);                 // 显示文件对话框
  
  // 读取文件对话框选中的文件的内容并将其返回
     BufferedReader br=new BufferedReader(new FileReader(getPath()));
     StringBuffer sb=new StringBuffer();
     String aline;
     while((aline=br.readLine())!=null)
     sb.append(aline+'\n');
     br.close();
     return sb.toString();
    }
    public void setData(String data) throws IOException{
  // 显示保存模式对话框,并将数据data存入选中的文件中
     fDlg.setTitle("保存");
     fDlg.setMode(FileDialog.LOAD);
     fDlg.setVisible(true);
     BufferedWriter bw=new BufferedWriter(new FileWriter(getPath()));
     bw.write(data);
     bw.close();
    }
}
// 文本管理类(提供记事本的剪贴,复制,粘贴等功能)
class MyClipboard{                           // 获取系统剪贴板
    private Clipboard cb;                    // 声明剪贴板对象
    public MyClipboard(){                   // 构造函数,获取系统剪贴板
     cb=Toolkit.getDefaultToolkit().getSystemClipboard();
    }
    public void setData(String data){       // 将字符串存入剪贴板
     cb.setContents(new StringSelection(data),null);
    }
    public String getData(){                // 从剪贴板读取数据,并将其返回
     Transferable content=cb.getContents(null);
     try{
      return (String)content.getTransferData(DataFlavor.stringFlavor);
     }catch(Exception ue){}
     return null;
    }
}
// 查找替换类(用于查找TextArea中特定字符串功能,并替换特定字符串
class MyFindDialog extends Dialog implements ActionListener{
    private Label lFind=new Label("查找字符串");
    private Label lReplace=new Label("替换字符串");
    private TextField tFind=new TextField(10);         // 接受待查字符串TextField
    private TextField tReplace=new TextField(10);    // 接受要替换字符串TextField
    private Button bFind=new Button("查找");            // 创建查找按钮
    private Button bReplace=new Button("替换");         // 替换按钮
    private TextArea ta;                           // ta为含有待查字符串的TextField
 
    public MyFindDialog(Frame owner,TextArea ta){      // 构造函数
     super(owner,"查找",false);                         // 非模式对话框
     this.ta=ta;
     setLayout(null);                                  // 将Layout设为null
  
  // 设定组件的位置大小(横坐标,纵坐标,高,宽)
     lFind.setBounds(10,30,80,20);
     lReplace.setBounds(10,70,80,20);
     tFind.setBounds(90,30,90,20);
     tReplace.setBounds(90,70,90,20);
     bFind.setBounds(190,30,80,20);
     bReplace.setBounds(190,70,80,20);
  
     add(lFind);       // 添加各个组件
     add(tFind);
     add(bFind);
     add(lReplace);
     add(tReplace);
     add(bReplace);
  
     setResizable(false);                            // 禁止用户更改对话框大小
     bFind.addActionListener(this);                 // 为bFind添加监听对象
     addWindowListener(new WindowAdapter(){   // 为对话框注册关闭窗口事件监听器
      public void windowClosing(WindowEvent e){
       MyFindDialog.this.dispose();
      }
     });
    }
    public void showFind(){
     setTitle("查找");                           // 将对话框标题设为"查找"
     setSize(280,60);                             // 将对话框设定为合适大小
     setVisible(true);
    }
    public void showReplace(){                    
     setTitle("查找替换");                    // 标题:"查找替换"
     setSize(280,110);                        // 设定大小
     setVisible(true);
    }
   
    private void find(){                      // 查询方法
     String text=ta.getText();                // 从ta中获取字符串,并存入text中
     String str=tFind.getText();              // 获取tFind字符串,并存入text中
     int end=text.length();                   // 获取ta字符串的长度
     int len=str.length();                    // 获取tFind字符串的长度
     int start=ta.getSelectionEnd();          // 从关标位置开始查找字符串
     if(start==end)start=0;                   // 若关标位于末尾,则从头开始查找
     for(;start<=end-len;start++){
      if(text.substring(start,start+len).equals(str)){// 若找到查找字符串
       ta.setSelectionStart(start);                  // 选中并显示字符串
       ta.setSelectionEnd(start+len);
       return;                                      // 退出方法
      }
     }
  
     ta.setSelectionStart(end);               // 若找不到待查字符串,则将光标置于末尾
     ta.setSelectionEnd(end);
    }
    private void replace(){                                 // 替换方法
     String str=tReplace.getText();                      // 获取待查字符串
     if(ta.getSelectedText().equals(tFind.getText()))    // 若相同则替换
     ta.replaceRange(str,ta.getSelectionStart(),ta.getSelectionEnd()); // 若不同则继续查找
     else find();
    }
    public void actionPerformed(ActionEvent e){
     if(e.getSource()==bFind)                   // 按下"查找"按钮,调用find()方法
     find();
     else if(e.getSource()==bReplace)           // 按下"替换"按钮,调用replace()方法
     replace();
    }
}
public class Jishiben extends Frame implements ActionListener{
   
      /**
		 * 
		 */
private static final long serialVersionUID = 1L;
private TextArea editor=new TextArea();         // 创建文本编辑区
      private MyFile mf=new MyFile(this);              // 创建文件
      private MyClipboard cb=new MyClipboard();       // 创建剪贴板
      private MyFindDialog findDlg=new MyFindDialog(this,editor);// 创建查找对话框
   
      public Jishiben(String title){
   // 构造函数,调用父类的构造函数设定标题
      super(title);
   
   // 创建菜单条
      MyMenuBar mb=new MyMenuBar(this);
   
   // 向菜单条中菜单添加文件,编辑,查找,帮助4个菜单项
      mb.addMenus(new String[]{"文件","编辑","查找","帮助"});
   
   // 向每个菜单添项加子菜单
      mb.addMenuItems(0,new String[]{"新建","打开","保存","null","退出" });
      mb.addMenuItems(1,new String[]{"剪贴","复制","粘贴","清除","null","全选" });
      mb.addMenuItems(2,new String[]{"查找","null","查找替换"});
      mb.addMenuItems(3,new String[]{"我的记事本信息"});
   
      add(editor);
      mb.addActionListener(this);
   
   addWindowListener(new WindowAdapter(){           // 关闭"记事本"代码
       public void windowClosing(WindowEvent e){
        Jishiben.this.dispose();
       }
      });
      }
      public void     actionPerformed(ActionEvent e){  // 事件执行方法
       String selected=e.getActionCommand();          // 获取命令
      if(selected.equals("新建"))                     // 执行"新建"命令
       editor.setText("");
      else if(selected.equals("打开")){               // 执行"打开"命令
       try{                                           // 可能出现异常
        editor.setText(mf.getData());
        }catch(IOException ie){}
      }else if(selected.equals("保存")){             // 执行"保存"命令
       try{                                         // 可能出现异常
        mf.setData(editor.getText());          
        }catch(IOException ie){}
      }else if(selected.equals("退出")){            // 执行"退出"命令
       dispose();
      }
      else if(selected.equals("剪贴")){             // 执行"剪贴"命令
       cb.setData(editor.getSelectedText());
       editor.replaceRange("",editor.getSelectionStart(),editor.getSelectionEnd());
      }
      else if(selected.equals("复制")){             // 执行"复制"命令
       cb.setData(editor.getSelectedText()); 
      }
      else if(selected.equals("粘贴")){             // 执行"粘贴"命令
       String str=cb.getData();
       editor.replaceRange(str,editor.getSelectionStart(),editor.getSelectionEnd());
      }
      else if(selected.equals("清除")){              // 执行"清除"命令
          editor.replaceRange("",editor.getSelectionStart(),editor.getSelectionEnd());
      }
      else if(selected.equals("全选")){              // 执行"全选"命令
       editor.setSelectionStart(0);
       editor.setSelectionEnd(editor.getText().length());
      }
      else if(selected.equals("查找")){              // 执行"查找"命令
       findDlg.showReplace();
      }
      else if(selected.equals("查找替换")){           // 执行"查找替换"命令
       findDlg.showReplace();
      }
      }
      public static void main(String[] args) {      // 主函数体
  
          Jishiben memo=new Jishiben("我的记事本");      // 创建我的记事本
          memo.setSize(300,300);                    // 大小宽300,高300
          memo.setVisible(true);                    // 显示窗口
      }       
} 